package utils

import (
	"fmt"
	"github.com/spf13/cast"
	"github.com/xuri/excelize/v2"
	"log"
	"xiuxianActive/model/res"
)

func LoadCardDoc(filepath string) (map[int64]res.CardInfo, []res.BoxInfo) {
	// 读取 Excel 文件
	excelFile, err := excelize.OpenFile(filepath)
	if err != nil {
		log.Fatal(err)
		return nil, nil
	}
	// 读取 Excel 内容
	rows, err := excelFile.GetRows("Sheet1")
	if err != nil {
		log.Fatal(err)
		return nil, nil
	}
	boxes, keyMaps := classifyCard(rows)
	return keyMaps, boxes
}

// classifyCard 分类卡片
func classifyCard(rows [][]string) ([]res.BoxInfo, map[int64]res.CardInfo) {
	var boxes []res.BoxInfo
	var currentBox res.BoxInfo
	var currentStage res.StageInfo
	var prevAccount int64
	var currentBoxCardCount int64
	// 初始化第一个盒子
	currentBox = res.BoxInfo{
		Number: 1,
		Count:  0,
		List:   make([]res.StageInfo, 0),
	}
	allCards := make(map[int64]res.CardInfo)
	for i := 1; i < len(rows); i++ { // 从1开始，跳过表头
		row := rows[i]
		// 解析每一行数据
		uqKey := cast.ToInt64(row[0])
		account := cast.ToInt64(row[1])
		password := cast.ToInt64(row[2])

		cardInfo := res.CardInfo{
			UqKey:    uqKey,
			Account:  account,
			Password: password,
		}
		allCards[account] = cardInfo
		if i == 1 { // 初始化第一个阶段
			currentStage = res.StageInfo{
				StartNum: account,
				Count:    1, // 初始化阶段的卡片计数
				List:     []res.CardInfo{cardInfo},
			}
			currentBoxCardCount++ // 计算卡片总数
		} else {
			// 检查是否存在断层（账户号不连续）或当前盒子中的卡片已满
			if account != prevAccount+1 || currentBoxCardCount >= 200 {
				// 完成当前阶段
				currentStage.EndNum = prevAccount
				currentStage.Desc = fmt.Sprintf("Stage %d: %d - %d", len(currentBox.List)+1, currentStage.StartNum, currentStage.EndNum)
				// 将完成的阶段添加到 Box 中
				currentBox.List = append(currentBox.List, currentStage)

				// 检查当前 Box 是否已经满 200 张卡片
				if currentBoxCardCount >= 200 {
					currentBox.Count = currentBoxCardCount
					boxes = append(boxes, currentBox)
					// 初始化一个新的 BoxInfo
					currentBox = res.BoxInfo{
						Number: currentBox.Number + 1,
						Count:  0,
						List:   make([]res.StageInfo, 0),
					}
					currentBoxCardCount = 0
				}

				// 初始化一个新的 StageInfo
				currentStage = res.StageInfo{
					StartNum: account,
					Count:    1, // 初始化阶段的卡片计数
					List:     []res.CardInfo{cardInfo},
				}
				currentBoxCardCount++
			} else {
				// 如果连续，继续添加到当前阶段
				currentStage.List = append(currentStage.List, cardInfo)
				currentStage.Count++ // 增加阶段的卡片计数
				currentBoxCardCount++
			}
		}
		// 更新上一个账户号
		prevAccount = account
	}

	// 处理最后一个阶段
	if len(currentStage.List) > 0 {
		currentStage.EndNum = prevAccount
		currentStage.Desc = fmt.Sprintf("Stage %d: %d - %d", len(currentBox.List)+1, currentStage.StartNum, currentStage.EndNum)
		currentBox.List = append(currentBox.List, currentStage)
		currentBoxCardCount += int64(len(currentStage.List))
	}

	// 如果当前 Box 中有剩余的阶段，将其添加到结果中
	if currentBoxCardCount > 0 {
		currentBox.Count = currentBoxCardCount
		boxes = append(boxes, currentBox)
	}
	return boxes, allCards
}
